A compiler may be used to translate source code (e.g., in a human-readable format) into object code (e.g., a machine executable format). For example, a processor may be capable of executing the object code to achieve various results, computations, etc. As may be expected, a compiler plays an important role in generating object code. As a result, how a compiler translates source code into object code may have a direct impact on how efficiently a processor is able to execute the code.
Moreover, loops may generally consume a relatively high number of execution cycles during run-time. Accordingly, optimization of loop code compilation may be an important source for efficiency during program execution. For example, loop overhead may be reduced through loop fusion (also referred to as “loop combining”), where bodies of two adjacent loops are combined if they would iterate the same number of times and none of the data dependences between the statements in the two loops are violated by loop fusion. Accordingly, determination of data dependencies is a prerequisite to performance of loop fusion.